package com.dili.dd.gpi.util;

import jxl.CellView;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

/**
 * 导出excel
 * User: Zhao Yuan
 * Date: 13-10-24 上午11:23
 */
public class ExportExcelUtil {
    /**
     *创建excel，写入数据
     *
     * @param outStream
     * @param objData  导出内容数组
     * @param sheetName  导出工作表的名称
     * @param columnMap  导出Excel的表头数组
     * @return
     */
    public static int exportDataToExcel(OutputStream outStream, List<? extends Object> objData, String sheetName, Map<String, String> columnMap) {
        int flag = 0;
        //声明工作簿jxl.write.WritableWorkbook
        WritableWorkbook wwb;
        try {
            //根据传进来的file对象创建可写入的Excel工作薄
            wwb = Workbook.createWorkbook(outStream);
            /*
             * 创建一个工作表，sheetName为工作表的名称、"0"为第一个工作表
             * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
             * 代码中的"0"就是sheet1、其它的一一对应。
             * createSheet(sheetName, 0)一个是工作表的名称，另一个是工作表在工作薄中的位置
             */
            WritableSheet ws = wwb.createSheet(sheetName, 0);
            CellView cellView = new CellView();
            cellView.setAutosize(true); //设置自动大小
            ws.setColumnView(1, cellView);//根据内容自动设置列宽

            //创建单元格样式
            WritableCellFormat wcf = new WritableCellFormat();

            //背景颜色设置
            wcf.setBackground(Colour.WHITE);

            //单元格内容居中显示
            wcf.setAlignment(Alignment.CENTRE);

            //设置自定换行
            wcf.setWrap(true);


            //判断一下表头数组是否有数据
            if (columnMap != null && !columnMap.isEmpty()) {
                String[] columnNames = new String[columnMap.size()];
                columnMap.values().toArray(columnNames);
                //循环写入表头
                for (int i = 0; i < columnNames.length; i++) {
                    /*
                     * 添加单元格(Cell)内容addCell()
                     * 添加Label对象Label()
                     * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
                     * 如：jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
                     * Label(i, 0, columns[i], wcf)
                     * 其中i为列、0为行、columns[i]为数据、wcf为样式
                     * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
                     */
                    ws.addCell(new Label(i, 0, columnNames[i], wcf));
                }

                //判断表中是否有数据
                if (objData != null && objData.size() > 0) {
                    String[] properties = new String[columnMap.size()];
                    columnMap.keySet().toArray(properties);
                    //循环写入表中数据
                    for (int i = 0; i < objData.size(); i++) {
                        Object obj = objData.get(i);
                        //将得到的记录写入Cell(单元格)中
                        for (int j = 0; j < properties.length; j++) {
                            ws.addCell(new Label(j, i + 1, String.valueOf(ReflectUtils.getValueByFieldName(obj, properties[j]))));
                        }
                    }
                }
                //写入Exel工作表
                wwb.write();
                //关闭Excel工作薄对象
                wwb.close();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            flag = 1;
        }
        return flag;
    }

    public static void exportExcel(HttpServletResponse response ,String filename,List<? extends Object> listData,String sheetName,Map<String,String> columnMap){
        //创建一个缓冲输入流对象
        response.reset(); // 非常重要
        //创建输出流对象
        try(OutputStream outStream = response.getOutputStream();) {
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=" + new String(filename.getBytes("utf-8"),"iso-8859-1"));
            //调用上面的方法、生成Excel文件
            exportDataToExcel(outStream,listData, sheetName, columnMap);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
